function Person(name, age){
    this.name = name;
    this.age = age;
    this.say = function(){
        alert(this.name);
    }
}

var p1 = new Person("小明", 18);
var p2 = new Person("张三", 20);

alert(p1.name + ":" + p2.name);
//每一个对象都拥有一个constructor属性
alert(p1.constructor == Person);//true
//以构造函数实例化出的对象既是Person类型也是Object类型
alert(p1 instanceof Object);//true
alert(p1 instanceof Person);//true
alert(p1 instanceof Object);//true
alert(p1 instanceof Person);//true

//缺点：每一次实例化对象构造函数中的方法就会产生一个新实例，然而函数对象只需要一个实例即可

alert(p1.say == p2.say);//false

//解决方法：构造函数引用一个say(全局)函数
//但是：
//1.缺失了OOP的封装性
//2.失去了全局函数的意义(只能被指定类型对象正常使用)